import { validationRules } from './regexs';

// 定义验证规则映射
const validationMapping = new Map(Object.entries({
  validateUsername: [validationRules.USERNAME_NOT_NULL, validationRules.USERNAME_LENGTH],
  validatePassword: [validationRules.PASSWORD_NOT_NULL, validationRules.PASSWORD_LENGTH],
}));



/**
 * 验证函数
 * @param {*} regex 正则表达式或者函数
 * @param {*} errorMessage 错误信息
 * @param {*} value 要验证的值
 * @returns 验证结果
 */
const validator = (obj, value) => {
  //判断regex是否是一个函数 如果是一个函数就执行当前的函数
  if (typeof obj.regex === 'function') {
    //如果是函数就执行regex函数
    return obj.regex(value);
    //如果不是函数就判断是否是一个正则表达式
  } else if (obj.regex instanceof RegExp) {
    //当前是一个正则表达式就判断是否匹配
    return obj.regex.test(value) ? true : obj.errorMessage;
  } else {
    //如果不是函数也不是正则表达式就返回一个错误信息
    return '异常：没有这个验证格式';
  }
};

/**
 * 验证字段的函数
 * @param {*} field 要验证的字段名
 * @param {*} value 要验证的值
 * @param {*} callback 验证完成后的回调函数
 */
const validateField = (field, value, callback) => {
  // 获取验证字段的规则列表
  let mappingList = validationMapping.get(field);
  // 用于存储验证结果的变量
  let fnRusult;
  // 遍历规则列表，依次验证字段
  for (let i = 0; i < mappingList.length; i++) {
    // 使用 validator 函数验证字段
    try {
      fnRusult = validator(mappingList[i], value);
    } catch (error) {
      callback(new Error(error));
    }
    
    // 如果验证结果不为 true，则跳出循环
    if (fnRusult !== true) {
      break;
    }
  }
  // 如果循环验证结果还是为 true，则调用回调函数，表示验证通过
  if (fnRusult === true) {
    callback();
  } else {
    // 如果验证结果不为 true，则调用回调函数，并传递错误信息，表示验证失败
    callback(new Error(fnRusult));
  }
};

/**
 * 验证用户名的函数
 * @param {*} _ 未使用的参数，通常用于占位符
 * @param {*} value 要验证的用户名
 * @param {*} callback 验证完成后的回调函数
 */
export function validateUsername(_, value, callback) {
  // 调用 validateField 函数验证用户名
  validateField('validateUsername', value, callback);
}

/**
 * 验证密码的函数
 * @param {*} _ 未使用的参数，通常用于占位符
 * @param {*} value 要验证的密码
 * @param {*} callback 验证完成后的回调函数
 */
export function validatePassword(_, value, callback) {
  // 调用 validateField 函数验证密码
  validateField('validatePassword', value, callback);
}
